<?php
	/**
	* Klassenbuch Online
	*
	* Copyright (c) [2006-2008] [Thomas Rams, Björn Lange, Daniel Poschmann, Manuel Schilcher, Eva Yoksulian]
	*
    * This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. 
	* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 
	* You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>. 
	*
	* Dieses Projekt wurde im Auftrag der IHK Mittlerer Niederrhein von der Deutschen Telekom AG, Berufsausbildung Krefeld ausgeführt.
	* Entwickelt haben dieses Projekt: Thomas Rams, Björn Lange, Daniel Poschmann, Manuel Schilcher, Eva Yoksulian
	*
	* Projekthomepage: www.bkukr.de/kbo
	*
	* @author   Thomas Rams
	* @package 	KlassenBuchOnline
	*/

	/**
	 * Die Klasse erinnert Schüler oder Lehrer an vergessene Entschuldigungen bzw. Schulstunden ohne Klassenbucheinträge
	 *
	 * @author
	 *   Richard Mahr - http://www.vollsprung.de
	 * 	 Pascal Paroll - cal@removed.de
	 *   Jan van Thoor - http://www.c010depunkk.com
	 */
    final class MissingEntries 
    {
    	/**
    	 * String-Variable zur Speicherung einer Fehlermeldung
    	 *
    	 * @var string
    	 */
        private $_serror;
        
        /**
    	 * String-Variable, die das Zeitinterval bezeichnet, in dem fehlende Lerninhalte nicht beachtet werden sollen
    	 *
    	 * @var string
    	 */
        private $lessons_interval = '1 DAY';
        
        /**
    	 * String-Variable, die das Zeitinterval bezeichnet, in dem untentschuldigte Fehlstunden nicht beachtet werden sollen
    	 *
    	 * @var string
    	 */
        private $absence_interval = '1 WEEK';
        
        /**
    	 * Array, das alle fehlenden Lerninhalte beinhaltet
    	 *
    	 * @var array
    	 */
        private $lessons = array();
        
        /**
    	 * Array, das alle unentschuldigten Fehlstunden beinhaltet
    	 *
    	 * @var array
    	 */
        private $absence = array();
        
        /**
    	 * Array, das alle fehlenden Lerninhalte beinhaltet, die gefiltert wurden
    	 *
    	 * @var array
    	 */
        public $lesson_result = array();
        
        /**
    	 * Array, das alle untentschuldigten Fehlstunden beinhaltet, die gefiltert wurden
    	 *
    	 * @var array
    	 */
        public $absence_result = array();

        /**
         * Konstruktor
         *
         * Initialisiert die Variablen und füllt die Klasse mit dem Pfad zur Templatedatei
         *
         * @access public
         * @return void
         */
        public function __construct() {
        	
        }//Ende Konstruktor

        /**
         * __get($name) - Attributzugriff
         *
         * Diese Funktion überprüft ob die Fehlermeldung angefordert wird und gibt auch dann nur den
         * Fehler zurück.
         * 
         * @param string $name
         * @return mixed
         */
        public function __get($name) {if($name === 'error') {return $this->_serror;}}//Ende __get()

        /**
         * function checkMissingEntries()
         *
         * Prüft ob unentschuldigte Fehlstunden oder nicht eingetragene Lerninhalte vorhanden sind und speichert die Ergebnisse
         *
         * @param string: Gibt an, welche Prüfung durchgeführt werden soll
         * @return bool
         */
		public function checkMissingEntries($mode = 'lerninhalte') 
		{
			switch($mode) 
			{
				case 'fehlzeiten': // Auf unentschuldigte Fehlstunden prüfen
					
					if( !$this->getAbsenceTimeWithoutExcuse() ) // Unentschuldigte Fehlstunden erfolgreich geladen
					{
						$schueler_id = 0; // ### TODO ### Schüler-ID aus Session-Array?
						
						foreach( $this->absence as $absence_id => $absence ) // Alle unentschuldigten Fehlstunden durchlaufen
						{
							if( $schueler_id == $absence['benutzer_id'] ) // Fehlstunden des gewählten Schülers speichern
							{
								$this->absence_result[$absence_id] = $absence;
							}
						}
						
						if( !empty($this->absence_result) ) // Unentschuldigte Fehlstunden vorhanden
						{
							return false;
						}
					}
					else 
					{
						return true;
					}
					
					break;
				
				case 'lerninhalte': // Auf nicht eingetragene Lerninhalte prüfen
				
					$lehrer = 'MH'; // ### TODO ### Lehrer-Kürzel aus Session-Array?
				
					if( !$this->getLessonsWithoutEntry() ) // Schulstunden erfolgreich geladen
					{
						foreach( $this->lessons as $lesson_id => $lesson ) // Alle Schulstunden ohne Klassenbucheintrag durchlaufen
						{
							if( $lehrer == $lesson['lehrer'] ) // Schulstunden des gewählten Lehrers speichern
							{
								$this->lesson_result[$lesson_id] = $lesson;
							}
						}
						
						if( !empty($this->lesson_result) ) // Fehlende Einträge vorhanden
						{
							return false;
						}
					}
					else 
					{
						return true;
					}
					
					break;
					
				default: // Keine Routine für $mode vorhanden
					
					break;
			}
			
			return true;			
		}
		
		/**
	     * function getAbsenceTimeWithoutExcuse()
	     *
	     * Gibt alle vergangenen Schulstunden ohne Klassenbucheintrag zurück
	     *
	     * @return bool
	     */
		private function getAbsenceTimeWithoutExcuse() 
		{
			$sql = 'SELECT * 
				FROM kbo_anwesenheit
				WHERE entschuldigt = 0 
					AND date_timestamp < DATE_SUB(NOW(), INTERVAL '.mysql_real_escape_string($this->absence_interval).')
				ORDER BY date_timestamp, benutzer_id DESC';
			$sql_absence = mysql_query($sql);
			
			if( !$sql_absence )
			{
				$this->_serror = 'Bei der Abfrage der unentschuldigten Fehlzeiten ist ein Fehler aufgetreten: '.mysql_error();
				return true;
			}
			else 
			{
				while( $absence = mysql_fetch_assoc($sql_absence) )
				{
					$this->absence[$absence['id']] = array(
						'klasse_id' => $absence['klasse_id'],
						'benutzer_id' => $absence['benutzer_id'],
						'verspaetung_min' => $absence['verspaetung_min'],
						'anwesend' => $absence['anwesend'],
						'entlassen' => $absence['entlassen'],
						'vorzeitig_entlassen_time' => $absence['vorzeitig_entlassen_time'],
						'geaendert_benutzer_id' => $absence['geaendert_benutzer_id'],
						'date_timestamp' => $absence['date_timestamp']);
				}
			}
			
			return false;
		}
		
		/**
	     * function getLessonsWithoutEntry()
	     *
	     * Gibt alle Schulstunden ohne entsprechende Lerninhalte zurück
	     *
	     * @return bool
	     */
		private function getLessonsWithoutEntry() 
		{
			$sql = 'SELECT sp.*
				FROM kbo_stundenplan AS sp
				WHERE 
					NOT EXISTS 
					(
						SELECT * 
						FROM kbo_lerninhalte AS li 
						WHERE YEAR(sp.datum) = li.jahr AND MONTH(sp.datum) = li.monat AND DAY(sp.datum) = li.tag AND sp.stunden_id = li.stunde
					)
					AND sp.datum < DATE_SUB(NOW(), INTERVAL '.mysql_real_escape_string($this->lessons_interval).')
				ORDER BY sp.datum, sp.stunden_id, lehrer ASC';
			$sql_lessons = mysql_query($sql);
			
			if( !$sql_lessons )
			{
				$this->_serror = 'Bei der Abfrage der fehlenden Lerninhalte ist ein Fehler aufgetreten: '.mysql_error();
				return true;
			}
			else 
			{
				while( $lesson = mysql_fetch_assoc($sql_lessons) )
				{
					$this->lessons[$sql_lessons['id']] = array(
						'datum' => $sql_lessons['datum'],
						'stunden_id' => $sql_lessons['stunden_id'],
						'lehrer' => $sql_lessons['lehrer'],
						'klasse' => $sql_lessons['klasse'],
						'raum_id' => $sql_lessons['raum_id'],
						'fach' => $sql_lessons['fach']);
				}
			}
			
			return false;
		}		
    }
?>